home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / public / SciAn / src / ScianGlobalFunctions.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  15KB  |  441 lines

  1. /*ScianGlobalFunctions.c
  2.   Eric Pepke
  3.   7 February 1993
  4.  
  5.   Does global functions, i.e., functions that are available from anywhere
  6.   and don't work on specific objects.
  7. */
  8.  
  9. #include "Scian.h"
  10. #include "ScianTypes.h"
  11. #include "ScianLists.h"
  12. #include "ScianWindows.h"
  13. #include "ScianColors.h"
  14. #include "ScianIDs.h"
  15. #include "ScianObjWindows.h"
  16. #include "ScianButtons.h"
  17. #include "ScianErrors.h"
  18. #include "ScianDraw.h"
  19. #include "ScianControls.h"
  20. #include "ScianArrays.h"
  21. #include "ScianScripts.h"
  22. #include "ScianVisWindows.h"
  23. #include "ScianIcons.h"
  24. #include "ScianEvents.h"
  25. #include "ScianStyle.h"
  26. #include "ScianObjFunctions.h"
  27. #include "ScianGlobalFunctions.h"
  28. #include "ScianHelp.h"
  29. #include "ScianFilters.h"
  30. #include "ScianFileSystem.h"
  31. #include "ScianSockets.h"
  32. #include "ScianPointers.h"
  33. #include "ScianMenus.h"
  34. #include "ScianPreferences.h"
  35. #include "ScianFileSystem.h"
  36. #include "ScianAnimation.h"
  37.  
  38. ObjPtr globalActionClass;
  39.  
  40. typedef struct
  41.     {
  42.     char *name;        /*Name of function*/
  43.     void (*doRoutine)();    /*Routine to do it*/
  44.     char *buttonHelp;    /*Button help*/
  45.     char *menuHelp;        /*Menu help*/
  46.     char *scriptLine;    /*Line for script*/
  47.     ObjPtr menu;        /*Which menu this routine is in*/
  48.     int menuGroup;        /*Which menu group this function is in*/
  49.     } GlobalFunction;
  50.  
  51. int nGlobalFunctions = 0;    /*# of global functions*/
  52.  
  53. static GlobalFunction *globalFunctions;
  54.  
  55. #ifdef PROTO
  56. int NameToGlobalFunction(char *name)
  57. #else
  58. int NameToGlobalFunction(name)
  59. char *name;
  60. #endif
  61. /*Converts a name to a function number, or -1*/
  62. {
  63.     int funcNum;
  64.  
  65.     /*Search for the named function*/
  66.     for (funcNum = 0; funcNum < nGlobalFunctions; ++funcNum)
  67.     {
  68.     if (0 == strcmp2(name, globalFunctions[funcNum] . name))
  69.     {
  70.         break;
  71.     }
  72.     }
  73.  
  74.     if (funcNum >= nGlobalFunctions)
  75.     {
  76.     /*Not found, too bad.*/
  77.     char nameStr[300];
  78.     sprintf(nameStr, "Internal error: name '%s' not found", name);
  79.     ReportError("NameToGlobalFunction", nameStr);
  80.     return -1;
  81.     }
  82.     return funcNum;
  83. }
  84.  
  85. #ifdef PROTO
  86. Bool GlobalFunctionScriptLine(char *line)
  87. #else
  88. Bool GlobalFunctionScriptLine(line)
  89. char *line;
  90. #endif
  91. /*If s is a script line, finds out if it is a valid script line for a
  92.   global function.  If so, does it and returns true, otherwise does nothing
  93.   and returns false.  Determines whether it is valid by matching the 
  94.   script line*/
  95. {
  96.     int funcNum;
  97.     register char *s, *p, *t;
  98.  
  99.     /*For all possible functions*/
  100.     for (funcNum = 0; funcNum < nGlobalFunctions; ++funcNum)
  101.     {
  102.     /*Try to match script line against script*/
  103.     s = line;
  104.     p = globalFunctions[funcNum] . scriptLine;
  105.  
  106.     if (!p) continue;
  107.  
  108.     SKIPBLANKS(s);
  109.     SKIPBLANKS(p);
  110.  
  111.     while (*p)
  112.     {
  113.         if (isspace(*p))
  114.         {
  115.         SKIPBLANKS(s);
  116.         SKIPBLANKS(p);
  117.         }
  118.         else if (toupper(*p) != toupper(*s))
  119.         {
  120.         /*Failure to match*/
  121.         break;
  122.         }
  123.         else
  124.         {
  125.         ++s;
  126.         ++p;
  127.         }
  128.     }
  129.  
  130.     if (*p == 0)
  131.     {
  132.         ObjPtr list;
  133.         ThingListPtr runner;
  134.         ObjPtr object;
  135.         /*It's a match!  Do this function and return true*/
  136.  
  137.         if (globalFunctions[funcNum] . scriptLine)
  138.         {
  139.         Log(globalFunctions[funcNum] . scriptLine);
  140.         Log("\n");
  141.         InhibitLogging(true);
  142.         }
  143.         if (globalFunctions[funcNum] . doRoutine)
  144.         {
  145.         (*(globalFunctions[funcNum] . doRoutine))();
  146.         }
  147.         if (globalFunctions[funcNum] . scriptLine)
  148.         {
  149.         InhibitLogging(false);
  150.         }
  151.  
  152.         return true;
  153.     }
  154.     }
  155.     return false;
  156. }
  157.  
  158. #ifdef PROTO
  159. void DefineGlobalFunction(char *funcName, void (*doRoutine)(),
  160.     char *scriptLine,
  161.     char *buttonHelp,
  162.     char *menuHelp, ObjPtr menu, int menuGroup)
  163. #else
  164. void DefineGlobalFunction(funcName, doRoutine, scriptLine,
  165.     buttonHelp, menuHelp, menu, menuGroup)
  166. char *funcName;
  167. void (*doRoutine)();
  168. char *scriptLine;
  169. char *buttonHelp;
  170. char *menuHelp;
  171. ObjPtr menu;
  172. int menuGroup;
  173. #endif
  174. /*Defines a global function
  175.     funcName        is the name of the function for the menu and buttons
  176.     doRoutine        is a routine to call to do it
  177.     scriptLine        is the script line
  178.     buttonHelp        is the help string for a button, or nothing for no button
  179.     menuHelp        is the help string for a menu
  180.     menu        is which menu to use, or NULLOBJ for none
  181.     menuGroup        is the menu group
  182. */
  183. {
  184.     if (nGlobalFunctions)
  185.     {
  186.     globalFunctions = Realloc(globalFunctions, (nGlobalFunctions + 1) * sizeof(GlobalFunction));
  187.     }
  188.     else
  189.     {
  190.     globalFunctions = Alloc((nGlobalFunctions + 1) * sizeof(GlobalFunction));
  191.     }
  192.  
  193.     if (funcName)
  194.     {
  195.     globalFunctions[nGlobalFunctions] . name = Alloc(strlen(funcName) + 1);
  196.     strcpy(globalFunctions[nGlobalFunctions] . name, funcName);
  197.     }
  198.     else
  199.     {
  200.     globalFunctions[nGlobalFunctions] . name = (char *) 0;
  201.     }
  202.     globalFunctions[nGlobalFunctions] . doRoutine = doRoutine;
  203.     globalFunctions[nGlobalFunctions] . menu = menu;
  204.     globalFunctions[nGlobalFunctions] . menuGroup = menuGroup;
  205.     if (scriptLine)
  206.     {
  207.     globalFunctions[nGlobalFunctions] . scriptLine = Alloc(strlen(scriptLine) + 1);
  208.     strcpy(globalFunctions[nGlobalFunctions] . scriptLine, scriptLine);
  209.     }
  210.     else
  211.     {
  212.     globalFunctions[nGlobalFunctions] . scriptLine = (char *) 0;
  213.     }
  214.     if (buttonHelp)
  215.     {
  216.     globalFunctions[nGlobalFunctions] . buttonHelp = Alloc(strlen(buttonHelp) + 1);
  217.     strcpy(globalFunctions[nGlobalFunctions] . buttonHelp, buttonHelp);
  218.     }
  219.     else
  220.     {
  221.     globalFunctions[nGlobalFunctions] . buttonHelp = (char *) 0;
  222.     }
  223.     if (menuHelp)
  224.     {
  225.     globalFunctions[nGlobalFunctions] . menuHelp = Alloc(strlen(menuHelp) + 1);
  226.     strcpy(globalFunctions[nGlobalFunctions] . menuHelp, menuHelp);
  227.     }
  228.     else
  229.     {
  230.     globalFunctions[nGlobalFunctions] . menuHelp = (char *) 0;
  231.     }
  232.  
  233.     /*Put it on the appropriate menu*/
  234.     if (menu)
  235.     {
  236.     /*Put it on menu*/
  237.     ObjPtr action;
  238.  
  239.     action = NewAction(funcName, globalActionClass);
  240.     SetVar(action, HELPSTRING, NewString(menuHelp));
  241.     AddMenuItem(menu, action, menuGroup);
  242.     }
  243.  
  244.     ++nGlobalFunctions;
  245. }
  246.  
  247. ObjPtr GlobalAction(action)
  248. ObjPtr action;
  249. /*Does the action method of a global action*/
  250. {
  251.     int whichFunction;
  252.     ObjPtr var;
  253.  
  254.     var = GetVar(action, NAME);
  255.     if (var)
  256.     {
  257.     whichFunction = NameToGlobalFunction(GetString(var));
  258.     if (contextHelp)
  259.     {
  260.         /*Give help on the action*/
  261.         ContextHelp(action);
  262.         contextHelp = false;
  263.         MySetCursor(0);
  264.     }
  265.     else
  266.     {
  267.         /*Log it*/
  268.         if (globalFunctions[whichFunction] . scriptLine)
  269.         {
  270.         Log(globalFunctions[whichFunction] . scriptLine);
  271.         Log("\n");
  272.         InhibitLogging(true);
  273.         }
  274.         /*Do it*/
  275.         if (globalFunctions[whichFunction] . doRoutine)
  276.         {
  277.         (*(globalFunctions[whichFunction] . doRoutine))();
  278.         }
  279.         if (globalFunctions[whichFunction] . scriptLine)
  280.         {
  281.         InhibitLogging(false);
  282.         }
  283.     }
  284.     }
  285.     return ObjTrue;
  286. }
  287.  
  288. #ifdef PROTO
  289. void InitGlobalFunctions(void)
  290. #else
  291. void InitGlobalFunctions()
  292. #endif
  293. /*Initializes global functions.  Assumes menus have been initialized*/
  294. {
  295.     /*Make the class for global actions*/
  296.     globalActionClass = NewObject(actionClass, 0L);
  297.     AddToReferenceList(globalActionClass);
  298.     SetMethod(globalActionClass, ACTIONMETHOD, GlobalAction);
  299.  
  300.     DefineGlobalFunction(GF_HELP, DoShowHelp, "show help",
  301.     "Pressing this button shows the SciAn help window, which gives you general help on using SciAn as well as the ability to get help on any control or menu item.",
  302.     "Choosing this menu item shows the SciAn help window, which gives you general help on using SciAn as well as the ability to get help on any control or menu item.",
  303.     mainMenu, 0);
  304.  
  305.     DefineGlobalFunction(GF_CONTEXTHELP, SetContextSensitiveHelp, (char *) 0,
  306.     "Pressing this button prepares SciAn for giving you help in context.  \
  307. After you press this press, you can click on any object in SciAn to get help on it.",
  308.     "Choosing this menu item prepares SciAn for giving you help in context.  \
  309. After you choose this item, you can click on any object in SciAn to get help on it.",
  310.     hiddenMenu, 4);
  311.  
  312. #ifdef IRISNTSC
  313.     DefineGlobalFunction(GF_TOGGLENTSC, ToggleNTSC, (char *) 0,
  314.     "Pressing this button toggles in and out of NTSC mode.",
  315.     "Choosing this menu item toggles in and out of NTSC mode.",
  316.     hiddenMenu, 4);
  317.  
  318.     DefineGlobalFunction(GF_TOGGLESTEREO, ToggleStereo, (char *) 0,
  319.     "Pressing this button toggles in and out of Crystal Eyes stereo mode.",
  320.     "Choosing this menu item toggles in and out of Crystal Eyes stereo mode.",
  321.     hiddenMenu, 4);
  322. #endif
  323.  
  324.     DefineGlobalFunction(GF_PREFERENCES, DoShowPreferences, "show preferences",
  325.     "Pressing this button shows a control panel that lets you change various interaction preferences and defaults within SciAn.",
  326.     "Choosing this menu item shows a control panel that lets you change various interaction preferences and defaults within SciAn.",
  327.     mainMenu, 0);
  328.  
  329.     DefineGlobalFunction(GF_QUIT, MaybeQuit, (char *) 0,
  330.     "Pressing this button causes SciAn to quit.  You will be asked for a confirmation before the program quits.  If you do not want to see the confirmation, hold down the Alt key while pressing the button.",
  331.     "Choosing this menu item causes SciAn to quit.  You will be asked for a confirmation before the program quits.  If you do not want to see the confirmation, hold down the Alt key before you release the mouse button.",
  332.     mainMenu, 2);
  333.  
  334.     DefineGlobalFunction(GF_BROWSER, DoNewFileWindow, "new browser",
  335.     "Pressing this button brings up a new file browser, which allows you \
  336. to find and open disk files.  First you will \
  337. see a dialog box asking for the directory to use.  If you know the name of the \
  338. directory you want to use, enter it in the text box and press OK.  If you don't \
  339. know the name of the directory, just press OK and navigate using the file browser.",
  340.     "Choosing this menu item brings up a new file browser, which allows you \
  341. to find and open disk files.  First you will \
  342. see a dialog box asking for the directory to use.  If you know the name of the \
  343. directory you want to use, enter it in the text box and press OK.  If you don't \
  344. know the name of the directory, just press OK and navigate using the file browser.",
  345.     fileMenu, 2);
  346.  
  347.     DefineGlobalFunction(GF_FILEREADERS, PopFileReadersWindow, "show file readers",
  348.     "Pressing this button shows a window containing icons for all the file readers within SciAn.",
  349.     "Choosing this menu item shows a window containing icons for all the file readers within SciAn.",
  350.     fileMenu, 2);
  351.  
  352. #ifdef SOCKETS
  353.     DefineGlobalFunction(GF_CONNECT, DoConnectToComputer, "connect",
  354.     "Pressing this button connects you to another copy of SciAn over the network.  You will be asked for the address of the computer to which to connect.",
  355.     "Choosing this menu item connects you to another copy of SciAn over the network.  You will be asked for the address of the computer to which to connect.",
  356.     networkMenu, 2);
  357. #endif
  358.  
  359.     DefineGlobalFunction(GF_DATASETS, PopDatasetsWindow, "show datasets",
  360.     "Pressing this button shows a window containing icons for all the datasets that have been read into SciAn.",
  361.     "Choosing this menu item shows a window containing icons for all the datasets that have been read into SciAn.",
  362.     datasetsMenu, 2);
  363.  
  364.     DefineGlobalFunction(GF_SELECTALL, DoSelectAllIcons, (char *) 0,
  365.     "Pressing this button selects all the icons in the window, if any.",
  366.     "Choosing this menu item selects all the icons in the window, if any.",
  367.     objectMenu, 2);
  368.     DefineGlobalFunction(GF_DESELECTALL, DeselectAll, (char *) 0,
  369.     "Pressing this button deselects all the currently selected objects, if any.",
  370.     "Choosing this menu item deselects all the currently selected objects, if any.",
  371.     objectMenu, 2);
  372.  
  373. #ifdef GODLIKE
  374.     DefineGlobalFunction(GF_TOGGLEEDIT, ToggleShowBounds, (char *) 0, "", "", deusMenu, 1);
  375.     DefineGlobalFunction(GF_SAVETEMPLATE, DoSaveTemplate, (char *) 0, "", "", deusMenu, 1);
  376.     DefineGlobalFunction(GF_NEWSLIDER, DoNewScreenSlider, (char *) 0, "", "", deusMenu, 1);
  377.     DefineGlobalFunction(GF_NEWSCALESLIDER, DoNewScreenScaleSlider, (char *) 0, "", "", deusMenu, 1);
  378.     DefineGlobalFunction(GF_NEWTITLEBOX, DoNewScreenTitleBox, (char *) 0, "", "", deusMenu, 1);
  379.     DefineGlobalFunction(GF_NEWRADIOBUTTON, DoNewScreenRadioButton, (char *) 0, "", "", deusMenu, 1);
  380.     DefineGlobalFunction(GF_NEWPLAINBUTTON, DoNewScreenPlainButton, (char *) 0, "", "", deusMenu, 1);
  381.     DefineGlobalFunction(GF_NEWSHORTBUTTON, DoNewScreenShortButton, (char *) 0, "", "", deusMenu, 1);
  382.     DefineGlobalFunction(GF_NEWCHECKBOX, DoNewScreenCheckBox, (char *) 0, "", "", deusMenu, 1);
  383.     DefineGlobalFunction(GF_NEWTEXTBOX, DoNewScreenTextBox, (char *) 0, "", "", deusMenu, 1);
  384.     DefineGlobalFunction(GF_NEWEDITBOX, DoNewScreenEditableTextBox, (char *) 0, "", "", deusMenu, 1);
  385. #ifdef PARANOID
  386.     DefineGlobalFunction("Print Memory Stats", PrintMemStats, (char *) 0, "", "", deusMenu, 1);
  387. #endif
  388. #endif
  389.  
  390.     DefineGlobalFunction(GF_RECORDERS, PopRecorderDriversWindow, "show recorders",
  391.     "Pressing this button shows a window containing icons for all the animation recorder drivers within SciAn.",
  392.     "Choosing this menu item shows a window containing icons for all the animation recorder drivers within SciAn.",
  393.     animationMenu, 1);
  394.  
  395. #ifndef RELEASE
  396.     DefineGlobalFunction(GF_NEWSEQUENCE, DoNewSequence, "new sequence",
  397.     "Pressing this button creates a new animation sequence.",
  398.     "Choosing this menu item creates a new animation sequence.",
  399.     animationMenu, 1);
  400. #endif
  401.  
  402. #ifndef RELEASE
  403.     DefineGlobalFunction(GF_UNDO, Undo, (char *) 0,
  404.     "Pressing this button undoes the last operation.  It doesn't really work on much yet.",
  405.     "Choosing this menu item undoes the last operation.  It doesn't really work on much yet.",
  406.     textMenu, 0);
  407. #endif
  408.  
  409.     DefineGlobalFunction(GF_CLOSE, DoClose, "close",
  410.     "Pressing this button closes the window.  On some systems such as the IBM RS/6000, \
  411. this is the only safe way to close a window.  On other systems, such as Silicon Graphics \
  412. workstations, you can also close a window using the Motif menu at the left side \
  413. of the title bar.",
  414.     "Choosing this menu item closes the window.  On some systems such as the IBM RS/6000, \
  415. this is the only safe way to close a window.  On other systems, such as Silicon Graphics \
  416. workstations, you can also close a window using the Motif menu at the left side \
  417. of the title bar.",
  418.     windowMenu, 4);
  419. }
  420.  
  421. #ifdef PROTO
  422. void KillGlobalFunctions(void)
  423. #else
  424. void KillGlobalFunctions(void);
  425. #endif
  426. {
  427.     int k;
  428.  
  429.     for (k = 0; k < nGlobalFunctions; ++k)
  430.     {
  431.     SAFEFREE(globalFunctions[k] . name);
  432.     SAFEFREE(globalFunctions[k] . scriptLine);
  433.     SAFEFREE(globalFunctions[k] . menuHelp);
  434.     SAFEFREE(globalFunctions[k] . buttonHelp);
  435.     }
  436.     SAFEFREE(globalFunctions);
  437.     RemoveFromReferenceList(globalActionClass);
  438. }
  439.  
  440.  
  441.